home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / dsp / dspgroup / fft32010.arc / PROGRAM.6 < prev    next >
Encoding:
Text File  |  1984-11-13  |  11.4 KB  |  579 lines

  1.     IDT 'FFTS64'
  2. *
  3. *
  4. *    Cooley-Tukey Radix-4, DIF FFT Program - 64-point straight-line.
  5. *
  6. *    Three radix-4 butterflies - implemented with macros.
  7. *    Complex input data located on page 0 of data memory.
  8. *    Results are left in data RAM.
  9. *    Uses 13-bit coefficients from MPYK instructions.
  10. *    No scaling is done on intermediate values in the program.
  11. *
  12. *
  13. * Data memory allocation.
  14. *
  15. X0     EQU 0         * X's are real data values
  16. Y0     EQU 1         * Y's are imaginary data values
  17. X1     EQU 2
  18. Y1     EQU 3
  19. X2     EQU 4
  20. Y2     EQU 5
  21. X3     EQU 6
  22. Y3     EQU 7
  23. X4     EQU 8
  24. Y4     EQU 9
  25. X5     EQU 10
  26. Y5     EQU 11
  27. X6     EQU 12
  28. Y6     EQU 13
  29. X7     EQU 14
  30. Y7     EQU 15
  31. X8     EQU 16
  32. Y8     EQU 17
  33. X9     EQU 18
  34. Y9     EQU 19
  35. X10     EQU 20
  36. Y10     EQU 21
  37. X11     EQU 22
  38. Y11     EQU 23
  39. X12     EQU 24
  40. Y12     EQU 25
  41. X13     EQU 26
  42. Y13     EQU 27
  43. X14     EQU 28
  44. Y14     EQU 29
  45. X15     EQU 30
  46. Y15     EQU 31
  47. X16     EQU 32
  48. Y16     EQU 33
  49. X17     EQU 34
  50. Y17     EQU 35
  51. X18     EQU 36
  52. Y18     EQU 37
  53. X19     EQU 38
  54. Y19     EQU 39
  55. X20     EQU 40
  56. Y20     EQU 41
  57. X21     EQU 42
  58. Y21     EQU 43
  59. X22     EQU 44
  60. Y22     EQU 45
  61. X23     EQU 46
  62. Y23     EQU 47
  63. X24     EQU 48
  64. Y24     EQU 49
  65. X25     EQU 50
  66. Y25     EQU 51
  67. X26     EQU 52
  68. Y26     EQU 53
  69. X27     EQU 54
  70. Y27     EQU 55
  71. X28     EQU 56
  72. Y28     EQU 57
  73. X29     EQU 58
  74. Y29     EQU 59
  75. X30     EQU 60
  76. Y30     EQU 61
  77. X31     EQU 62
  78. Y31     EQU 63
  79. X32     EQU 64
  80. Y32     EQU 65
  81. X33     EQU 66
  82. Y33     EQU 67
  83. X34     EQU 68
  84. Y34     EQU 69
  85. X35     EQU 70
  86. Y35     EQU 71
  87. X36     EQU 72
  88. Y36     EQU 73
  89. X37     EQU 74
  90. Y37     EQU 75
  91. X38     EQU 76
  92. Y38     EQU 77
  93. X39     EQU 78
  94. Y39     EQU 79
  95. X40     EQU 80
  96. Y40     EQU 81
  97. X41     EQU 82
  98. Y41     EQU 83
  99. X42     EQU 84
  100. Y42     EQU 85
  101. X43     EQU 86
  102. Y43     EQU 87
  103. X44     EQU 88
  104. Y44     EQU 89
  105. X45     EQU 90
  106. Y45     EQU 91
  107. X46     EQU 92
  108. Y46     EQU 93
  109. X47     EQU 94
  110. Y47     EQU 95
  111. X48     EQU 96
  112. Y48     EQU 97
  113. X49     EQU 98
  114. Y49     EQU 99
  115. X50     EQU 100
  116. Y50     EQU 101
  117. X51     EQU 102
  118. Y51     EQU 103
  119. X52     EQU 104
  120. Y52     EQU 105
  121. X53     EQU 106
  122. Y53     EQU 107
  123. X54     EQU 108
  124. Y54     EQU 109
  125. X55     EQU 110
  126. Y55     EQU 111
  127. X56     EQU 112
  128. Y56     EQU 113
  129. X57     EQU 114
  130. Y57     EQU 115
  131. X58     EQU 116
  132. Y58     EQU 117
  133. X59     EQU 118
  134. Y59     EQU 119
  135. X60     EQU 120
  136. Y60     EQU 121
  137. X61     EQU 122
  138. Y61     EQU 123
  139. X62     EQU 124
  140. Y62     EQU 125
  141. X63     EQU 126
  142. Y63     EQU 127
  143. T1     EQU 128    * Temporary locations addressed
  144. T2     EQU 129    * by auxiliary registers.
  145. *************************************************************************
  146. *
  147. * Cosine and sine values (13-bit) for coefficients.
  148. *
  149. CO0    EQU 4095
  150. CO1    EQU 4076
  151. CO2    EQU 4017
  152. CO3    EQU 3919
  153. CO4    EQU 3784
  154. CO5    EQU 3612
  155. CO6    EQU 3405
  156. CO7    EQU 3166
  157. CO8    EQU 2896
  158. CO9    EQU 2598
  159. CO10   EQU 2275
  160. CO11   EQU 1930
  161. CO12   EQU 1567
  162. CO13   EQU 1188
  163. CO14   EQU 799
  164. CO15   EQU 401
  165. CO16   EQU 0
  166. CO17   EQU -401
  167. CO18   EQU -799
  168. CO19   EQU -1188
  169. CO20   EQU -1567
  170. CO21   EQU -1930
  171. CO22   EQU -2275
  172. CO23   EQU -2598
  173. CO24   EQU -2896
  174. CO25   EQU -3166
  175. CO26   EQU -3405
  176. CO27   EQU -3612
  177. CO28   EQU -3784
  178. CO29   EQU -3919
  179. CO30   EQU -4017
  180. CO31   EQU -4076
  181. CO32   EQU -4095
  182. CO33   EQU -4076
  183. CO34   EQU -4017
  184. CO35   EQU -3919
  185. CO36   EQU -3784
  186. CO37   EQU -3612
  187. CO38   EQU -3405
  188. CO39   EQU -3166
  189. CO40   EQU -2896
  190. CO41   EQU -2598
  191. CO42   EQU -2275
  192. CO43   EQU -1930
  193. CO44   EQU -1567
  194. CO45   EQU -1188
  195. CO46   EQU -799
  196. CO47   EQU -401
  197. CO48   EQU 0
  198. CO49   EQU 401
  199. CO50   EQU 799
  200. CO51   EQU 1188
  201. CO52   EQU 1567
  202. CO53   EQU 1930
  203. CO54   EQU 2275
  204. CO55   EQU 2598
  205. CO56   EQU 2896
  206. CO57   EQU 3166
  207. CO58   EQU 3405
  208. CO59   EQU 3612
  209. CO60   EQU 3784
  210. CO61   EQU 3919
  211. CO62   EQU 4017
  212. CO63   EQU 4076
  213. *
  214. SI0    EQU 0
  215. SI1    EQU 401
  216. SI2    EQU 799
  217. SI3    EQU 1188
  218. SI4    EQU 1567
  219. SI5    EQU 1930
  220. SI6    EQU 2275
  221. SI7    EQU 2598
  222. SI8    EQU 2896
  223. SI9    EQU 3166
  224. SI10   EQU 3405
  225. SI11   EQU 3612
  226. SI12   EQU 3784
  227. SI13   EQU 3919
  228. SI14   EQU 4017
  229. SI15   EQU 4076
  230. SI16   EQU 4095
  231. SI17   EQU 4076
  232. SI18   EQU 4017
  233. SI19   EQU 3919
  234. SI20   EQU 3784
  235. SI21   EQU 3612
  236. SI22   EQU 3405
  237. SI23   EQU 3166
  238. SI24   EQU 2896
  239. SI25   EQU 2598
  240. SI26   EQU 2275
  241. SI27   EQU 1930
  242. SI28   EQU 1567
  243. SI29   EQU 1188
  244. SI30   EQU 799
  245. SI31   EQU 401
  246. SI32   EQU 0
  247. SI33   EQU -401
  248. SI34   EQU -799
  249. SI35   EQU -1188
  250. SI36   EQU -1567
  251. SI37   EQU -1930
  252. SI38   EQU -2275
  253. SI39   EQU -2598
  254. SI40   EQU -2896
  255. SI41   EQU -3166
  256. SI42   EQU -3405
  257. SI43   EQU -3612
  258. SI44   EQU -3784
  259. SI45   EQU -3919
  260. SI46   EQU -4017
  261. SI47   EQU -4076
  262. SI48   EQU -4095
  263. SI49   EQU -4076
  264. SI50   EQU -4017
  265. SI51   EQU -3919
  266. SI52   EQU -3784
  267. SI53   EQU -3612
  268. SI54   EQU -3405
  269. SI55   EQU -3166
  270. SI56   EQU -2896
  271. SI57   EQU -2598
  272. SI58   EQU -2275
  273. SI59   EQU -1930
  274. SI60   EQU -1567
  275. SI61   EQU -1188
  276. SI62   EQU -799
  277. SI63   EQU -401
  278. ***********************************************************************
  279. *
  280. * MACROS TO PRODUCE STRAIGHT-LINE 64-POINT COMPLEX FFT.
  281. *
  282. ***********************************************************************
  283. *
  284. *  ZERO for case theta = 0.
  285. *
  286. *  X's and Y's are input and output locations for butterfly.
  287. *
  288. ZERO    $MACRO    XI,XI1,XI2,XI3,YI,YI1,YI2,YI3
  289. *
  290.     LAC  :XI1:
  291.     ADD  :XI3:
  292.     SACL :XI1:        * XI1 = XI1 + XI3
  293.     SUB  :XI3:,1
  294.     SACL :XI3:        * XI3 = XI1 - XI3
  295.     LAC  :XI:
  296.     SUB  :XI2:
  297.     SACL *,0,AR1        * T1 = XI - XI2
  298.     ADD  :XI2:,1        * R1 (ACC) = XI + XI2
  299.     ADD  :XI1:
  300.     SACL :XI:        * XI = R1 + XI1
  301.     SUB  :XI1:,1
  302.     SACL :XI2:        * XI2 = R1 - XI1
  303. *
  304.     LAC  :YI1:
  305.     ADD  :YI3:
  306.     SACL :YI1:        * YI1 = YI1 + YI3
  307.     SUB  :YI3:,1
  308.     SACL :YI3:        * YI3 = YI1 - YI3
  309.     LAC  :YI:
  310.     SUB  :YI2:
  311.     SACL *,0,AR0        * T2 = YI - YI2
  312.     ADD  :YI2:,1        * R1 (ACC) = YI + YI2
  313.     ADD  :YI1:
  314.     SACL :YI:        * YI = R1 + YI1
  315.     SUB  :YI1:,1
  316.     SACL :YI2:        * YI2 = R1 - YI1
  317. *
  318.     LAC  *
  319.     ADD  :YI3:
  320.     SACL :XI1:        * XI1 = T1 + YI3
  321.     SUB  :YI3:,1
  322.     SACL *,0,AR1        * T1 = T1 - YI3
  323.     LAC  *,0,AR0
  324.     ADD  :XI3:
  325.     SACL :YI3:        * YI3 = T2 + XI3
  326.     SUB  :XI3:,1
  327.     SACL :YI1:        * YI1 = T2 - XI3
  328.     LAC  *
  329.     SACL :XI3:        * XI3 = T1
  330. *
  331.     $END
  332. ***************************************************************************
  333. *
  334. * NORM - standard radix-4 butterfly.
  335. *
  336. * X's and Y's are locations of data input and output.
  337. * IA's specify twiddle factor locations.
  338. *
  339. NORM    $MACRO    XI,XI1,XI2,XI3,YI,YI1,YI2,YI3,IA1,IA2,IA3
  340. *
  341.     LAC  :XI1:
  342.     ADD  :XI3:
  343.     SACL :XI1:        * XI1 = XI1 + XI3
  344.     SUB  :XI3:,1
  345.     SACL :XI3:        * XI3 = XI1 - XI3
  346.     LAC  :XI:
  347.     SUB  :XI2:
  348.     SACL *,0,AR1        * T1 = XI - XI2
  349.     ADD  :XI2:,1        * R1 (ACC) = XI + XI2
  350.     ADD  :XI1:
  351.     SACL :XI:        * XI = R1 + XI1
  352.     SUB  :XI1:,1
  353.     SACL :XI2:        * XI2 = R1 - XI1
  354. *
  355.     LAC  :YI1:
  356.     ADD  :YI3:
  357.     SACL :YI1:        * YI1 = YI1 + YI3
  358.     SUB  :YI3:,1
  359.     SACL :YI3:        * YI3 = YI1 - YI3
  360.     LAC  :YI:
  361.     SUB  :YI2:
  362.     SACL *,0,AR0        * T2 = YI - YI2
  363.     ADD  :YI2:,1        * R1 (ACC) = YI + YI2
  364.     ADD  :YI1:
  365.     SACL :YI:        * YI = R1 + YI1
  366.     SUB  :YI1:,1
  367.     SACL :YI2:        * YI2 = R1 - YI1
  368. *
  369.     LAC  *
  370.     ADD  :YI3:
  371.     SACL :XI1:        * XI1 = T1 + YI3
  372.     SUB  :YI3:,1
  373.     SACL *,0,AR1        * T1 = T1 - YI3
  374.     LAC  *
  375.     ADD  :XI3:
  376.     SACL *            * T2 = T2 + XI3
  377.     SUB  :XI3:,1
  378.     SACL :YI1:        * YI1 = T2 - XI3
  379. *
  380.     LT   :YI1:
  381.     MPYK CO:IA1:
  382.     PAC
  383.     LT   :XI1:
  384.     MPYK SI:IA1:
  385.     SPAC
  386.     LT   :YI1:
  387.     SACH :YI1:,4        * YI1 = YI1*CO1 - XI1*SI1
  388.     MPYK SI:IA1:
  389.     PAC
  390.     LT   :XI1:
  391.     MPYK CO:IA1:
  392.     LTA  :YI2:
  393.     SACH :XI1:,4        * XI1 = YI1*SI1 + XI1*CO1
  394. *
  395.     MPYK CO:IA2:
  396.     PAC
  397.     LT   :XI2:
  398.     MPYK SI:IA2:
  399.     SPAC
  400.     LT   :YI2:
  401.     SACH :YI2:,4        * YI2 = YI2*CO2 - XI2*SI2
  402.     MPYK SI:IA2:
  403.     PAC
  404.     LT   :XI2:
  405.     MPYK CO:IA2:
  406.     LTA  *,AR0
  407.     SACH :XI2:,4        * XI2 = YI2*SI2 + XI2*CO2
  408. *
  409.     MPYK CO:IA3:
  410.     PAC
  411.     LT   *,AR1
  412.     MPYK SI:IA3:
  413.     SPAC
  414.     SACH :YI3:,4        * YI3 = T2*CO3 - T1*SI3
  415.     MPYK CO:IA3:
  416.     PAC
  417.     LT   *,AR0
  418.     MPYK SI:IA3:
  419.     APAC
  420.     SACH :XI3:,4        * XI3 = T1*CO3 + T2*SI3
  421. *
  422.     $END
  423. ***************************************************************************
  424. *
  425. * SPEC for case theta = pi/4
  426. *
  427. * X's and Y's are data input and output locations.
  428. *
  429. SPEC    $MACRO    XI,XI1,XI2,XI3,YI,YI1,YI2,YI3
  430. *
  431.     LAC  :XI:
  432.     ADD  :XI2:
  433.     SACL :XI:        * XI = XI + XI2
  434.     SUB  :XI2:,1
  435.     SACL :XI2:        * XI2 = XI - XI2
  436. *
  437.     LAC  :YI:
  438.     ADD  :YI2:
  439.     SACL :YI:        * YI = YI + YI2
  440.     SUB  :YI2:,1
  441.     SACL :YI2:        * YI2 = YI - YI2
  442. *
  443.     LAC  :XI1:
  444.     ADD  :XI3:
  445.     SACL :XI1:        * XI1 = XI1 + XI3
  446.     SUB  :XI3:,1
  447.     SACL :XI3:        * XI3 = XI1 - XI3
  448. *
  449.     LAC  :YI1:
  450.     ADD  :YI3:
  451.     SACL :YI1:        * YI1 = YI1 + YI3
  452.     SUB  :YI3:,1
  453.     SACL :YI3:        * YI3 = YI1 - YI3
  454. *
  455.     LAC  :XI1:
  456.     SUB  :XI:
  457.     SACL *,0,AR1        * T1 = XI1 - XI
  458.     ADD  :XI:,1
  459.     SACL :XI:        * XI = XI1 + XI
  460.     LAC  :YI:
  461.     ADD  :YI1:
  462.     SACL :YI:        * YI = YI + YI1
  463.     SUB  :YI1:,1
  464.     SACL *            * T2 = YI - YI1
  465. *
  466.     LAC  :XI2:
  467.     ADD  :YI3:
  468.     SACL :XI1:        * XI1 = XI2 + YI3
  469.     SUB  :YI3:,1
  470.     SACL :YI3:        * YI3 = XI2 - YI3
  471.     LAC  *,0,AR0
  472.     SACL :XI2:        * XI2 = T2
  473.     LAC  :YI2:
  474.     SUB  :XI3:
  475.     SACL :YI1:        * YI1 = YI2 - XI3
  476.     ADD  :XI3:,1
  477.     SACL :XI3:        * XI3 = YI2 + XI3
  478.     LAC  *
  479.     SACL :YI2:        * YI2 = T1
  480. *
  481.     LT   :YI1:
  482.     MPYK CO8
  483.     PAC
  484.     LT   :XI1:
  485.     MPYK CO8
  486.     SPAC
  487.     SACH :YI1:,4        * YI1 = (YI1-XI1)*CO8
  488.     APAC
  489.     LTA  :YI3:
  490.     SACH :XI1:,4        * XI1 = (YI1+XI1)*CO8
  491.     ZAC
  492.     MPYK CO8
  493.     SPAC
  494.     LT   :XI3:
  495.     MPYK CO8
  496.     SPAC
  497.     SACH :YI3:,4        * YI3 = -(YI3+XI3)*CO8
  498.     APAC
  499.     APAC
  500.     SACH :XI3:,4        * XI3 = (XI3 - YI3)*CO8
  501. *
  502.     $END
  503. *************************************************************************
  504. *
  505. *    MAIN routine to call above macros with appropriate parameters.
  506. *
  507. *************************************************************************
  508.     AORG 0
  509. *
  510. FFT64 LDPK 0            * Use input data is on page 0.
  511.       LARP 0
  512.       LARK AR0,T1        * AR0 points to Temp 1.
  513.       LARK AR1,T2        * AR1 points to Temp 2.
  514. *
  515. * PASS 1
  516. *
  517.       ZERO   X0,X16,X32,X48,Y0,Y16,Y32,Y48
  518. *
  519.       NORM   X1,X17,X33,X49,Y1,Y17,Y33,Y49,1,2,3
  520.       NORM   X2,X18,X34,X50,Y2,Y18,Y34,Y50,2,4,6
  521.       NORM   X3,X19,X35,X51,Y3,Y19,Y35,Y51,3,6,9
  522.       NORM   X4,X20,X36,X52,Y4,Y20,Y36,Y52,4,8,12
  523.       NORM   X5,X21,X37,X53,Y5,Y21,Y37,Y53,5,10,15
  524.       NORM   X6,X22,X38,X54,Y6,Y22,Y38,Y54,6,12,18
  525.       NORM   X7,X23,X39,X55,Y7,Y23,Y39,Y55,7,14,21
  526. *
  527.       SPEC   X8,X24,X40,X56,Y8,Y24,Y40,Y56
  528. *
  529.       NORM   X9,X25,X41,X57,Y9,Y25,Y41,Y57,9,18,27
  530.       NORM   X10,X26,X42,X58,Y10,Y26,Y42,Y58,10,20,30
  531.       NORM   X11,X27,X43,X59,Y11,Y27,Y43,Y59,11,22,33
  532.       NORM   X12,X28,X44,X60,Y12,Y28,Y44,Y60,12,24,36
  533.       NORM   X13,X29,X45,X61,Y13,Y29,Y45,Y61,13,26,39
  534.       NORM   X14,X30,X46,X62,Y14,Y30,Y46,Y62,14,28,42
  535.       NORM   X15,X31,X47,X63,Y15,Y31,Y47,Y63,15,30,45
  536. *
  537. * PASS 2
  538. *
  539.      ZERO    X0,X4,X8,X12,Y0,Y4,Y8,Y12
  540.      ZERO    X16,X20,X24,X28,Y16,Y20,Y24,Y28
  541.      ZERO    X32,X36,X40,X44,Y32,Y36,Y40,Y44
  542.      ZERO    X48,X52,X56,X60,Y48,Y52,Y56,Y60
  543. *
  544.      NORM    X1,X5,X9,X13,Y1,Y5,Y9,Y13,4,8,12
  545.      NORM    X17,X21,X25,X29,Y17,Y21,Y25,Y29,4,8,12
  546.      NORM    X33,X37,X41,X45,Y33,Y37,Y41,Y45,4,8,12
  547.      NORM    X49,X53,X57,X61,Y49,Y53,Y57,Y61,4,8,12
  548. *
  549.      SPEC    X2,X6,X10,X14,Y2,Y6,Y10,Y14
  550.      SPEC    X18,X22,X26,X30,Y18,Y22,Y26,Y30
  551.      SPEC    X34,X38,X42,X46,Y34,Y38,Y42,Y46
  552.      SPEC    X50,X54,X58,X62,Y50,Y54,Y58,Y62
  553. *
  554.      NORM    X3,X7,X11,X15,Y3,Y7,Y11,Y15,12,24,36
  555.      NORM    X19,X23,X27,X31,Y19,Y23,Y27,Y31,12,24,36
  556.      NORM    X35,X39,X43,X47,Y35,Y39,Y43,Y47,12,24,36
  557.      NORM    X51,X55,X59,X63,Y51,Y55,Y59,Y63,12,24,36
  558. *
  559. *  PASS 3
  560. *
  561.      ZERO    X0,X1,X2,X3,Y0,Y1,Y2,Y3
  562.      ZERO    X4,X5,X6,X7,Y4,Y5,Y6,Y7
  563.      ZERO    X8,X9,X10,X11,Y8,Y9,Y10,Y11
  564.      ZERO    X12,X13,X14,X15,Y12,Y13,Y14,Y15
  565.      ZERO    X16,X17,X18,X19,Y16,Y17,Y18,Y19
  566.      ZERO    X20,X21,X22,X23,Y20,Y21,Y22,Y23
  567.      ZERO    X24,X25,X26,X27,Y24,Y25,Y26,Y27
  568.      ZERO    X28,X29,X30,X31,Y28,Y29,Y30,Y31
  569.      ZERO    X32,X33,X34,X35,Y32,Y33,Y34,Y35
  570.      ZERO    X36,X37,X38,X39,Y36,Y37,Y38,Y39
  571.      ZERO    X40,X41,X42,X43,Y40,Y41,Y42,Y43
  572.      ZERO    X44,X45,X46,X47,Y44,Y45,Y46,Y47
  573.      ZERO    X48,X49,X50,X51,Y48,Y49,Y50,Y51
  574.      ZERO    X52,X53,X54,X55,Y52,Y53,Y54,Y55
  575.      ZERO    X56,X57,X58,X59,Y56,Y57,Y58,Y59
  576.      ZERO    X60,X61,X62,X63,Y60,Y61,Y62,Y63
  577. *
  578.      END
  579.